package com.arron.single;

/**
 * @Classname SingleTon4
 * @Description TODO
 * @Date 2020/8/15 16:47
 * @Created by 刘
 */

/**
 * 懒汉模式创建单例模式
 *
 * 使用静态内部类创建,在内部类加载的时候才创建实例
 * 内部类它要单独加载
 */
public class SingleTon4 {

    /**
     * //当第一次加载Singleton类时并不会初始化sInstance,只有在第一次调用Singleton的getInstance方法时才会导致sInstance被初始化。
     //因此第一次调用getInstance方法会导致虚拟机加载SingletonHolder类，
     //这种方式不仅能够确保线程安全，也能保证单例对象的唯一性，同时延迟了单例的实例化。

     //这种方式不仅能够确保线程安全

     //原因：虚拟机会保证一个类的构造器<clinit>()方法在多线程环境中被正确地加载，同步，如果多个线程同时去初始化一个类，那么只有一个线程去执行这个类的
     //构造器<clinit>()方法，其他线程都需要阻塞等待，直到活动线程执行<clinit>（）方法完毕
     *
     */
    private SingleTon4(){
    }

    static class Inner{
        private static final SingleTon4 INSTANCE=new SingleTon4();
    }

    public static  SingleTon4 getInstance(){
        return Inner.INSTANCE;
    }
}
